#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>

#define forn(i,n) for(i=0; i < (int)(n); ++i)

using namespace std;

string doubletostring(double value) {
  std::ostringstream o;
  if (!(o << value))
    return "";
  return o.str();
}

string dameChocloParametros(const vector< string > &params, const vector< float > &valores) {
	int i;
	string res = "";
	forn(i,params.size()) {
		float valor = valores[i];
		res += (params[i] + "=" +doubletostring(valor)+" ");
	}
	return res;
}

int main(int argc, char* argv[]) {
	/*valores busqueda*/
	float limiteInferior = 0;
	float limiteSuperior = 10;
	float delta = 0.1;
	
	/*Puntajes*/
	int puntJug0;
	int puntJug1;
	
	/*archivo*/
	ifstream archRes;
	
	/*Parametros*/
	vector< string > params;
	params.push_back("-p_cip");
	params.push_back("-p_cie");
	params.push_back("-p_tip");
	params.push_back("-p_tie");
	params.push_back("-p_fep");
	params.push_back("-p_fee");
	
	vector< float > valores = vector< float >(params.size(),0.1);
	vector< float > finales = vector< float >(params.size(),0.1);
	
	/*Jugadores*/
	string jugador0 = "./nuestros_jugadores/mike ";
	string jugador1 = "./jugadores/heurb";
	
	string parametros;
	
	/*Para calculo*/
	int cantPasadas = params.size();
	int cantParamMirar = params.size();
	int repeticiones = 50;
	int cantPartidas = 1;
	int tamTablero = 11;
	
	/*Para los for*/
	int pasada;
	int p;
	int r;
	int c;
	
	forn(pasada,cantPasadas) {
		forn(p,cantParamMirar) {
			vector< int > resultados = vector< int >(limiteSuperior * 10, 0);
			forn (r, repeticiones) {
				valores[p] = limiteInferior;
				int count = 0;
				while(valores[p] < limiteSuperior) {
					int victorias = 0;
					forn(c,cantPartidas) {
						parametros = "./judge " + doubletostring(tamTablero) + " " + jugador0 + dameChocloParametros(params,valores) + " -- " + jugador1 + " > result.txt";
						//cout << "\tParametros: " << parametros << endl;
						system(parametros.c_str());
						archRes.open("result.txt", ifstream::in);
						archRes >> puntJug0 >> puntJug1;
						archRes.close();
						//cout << "\tPartido -- " << "jug0: "<< puntJug0<< "|\t jug1: "<< puntJug1 << endl;
						if(puntJug1 < puntJug0) victorias++;
					}
					//sleep(1);
					resultados[count] += victorias;
					//cout << count << " " << valores[p] << endl;
					valores[p] += delta;
					count++;
				}
			}

			int final = 0;
			for (int i = 0; i < (int)resultados.size(); i++) {
				//cout << i << " " << resultados[i] << endl;
				if (resultados[i]>resultados[final]) final = i;
			}

			float ffinal = ((float)final)/10;
			//cout << ffinal << endl;
			
			valores[p] = ffinal;
		}
	}
	
	cout << "Parametros: " << dameChocloParametros(params,valores) << endl;
	
	return 0;
}
